//package com.example.wm.SanWar.controller;
//
//import cn.hutool.http.HttpException;
//import com.alibaba.fastjson.JSONObject;
//import com.example.wm.SanWar.VO.WxPayConfig;
//import com.example.wm.common.R;
//import com.example.wm.common.Result;
//import com.example.wm.common.ResultData;
//import com.example.wm.config.WxPayAutoCertificateConfig;
//import com.example.wm.utils.HttpServletUtils;
//import com.wechat.pay.java.core.Config;
//import com.wechat.pay.java.core.exception.MalformedMessageException;
//import com.wechat.pay.java.core.exception.ServiceException;
//
//
//import com.wechat.pay.java.core.notification.NotificationParser;
//import com.wechat.pay.java.core.notification.RequestParam;
//
//import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
//
//import com.wechat.pay.java.service.payments.jsapi.model.*;
//
//import com.wechat.pay.java.service.payments.model.Transaction;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import java.io.IOException;
//import java.math.BigDecimal;
//import java.util.HashMap;
//import java.util.Map;
//@RestController
//@RequestMapping("/Payoffaces")
//public class PayoffacesController {
//   @Resource
//   private WxPayAutoCertificateConfig wxPayAutoCertificateConfig;
//   @Resource
//   private WxPayConfig wxPayConfig;
//
//    @PostMapping("/create")
//    public Result<PrepayWithRequestPaymentResponse> createOrder(@RequestBody JSONObject jsonObject) {
//        // 创建本地订单
//        // wingzing:这里做本地业务相关的处理，包括生成一个订单号传递给微信，等于通过这个值来形成两边的数据对应。后续微信那边会返回他们的订单编号，也建议存在自己这边的数据库里。
//        // 请求微信支付相关配置
//                JsapiServiceExtension service =
//                new JsapiServiceExtension.Builder()
//                        .config(wxPayAutoCertificateConfig.rsaAutoCertificateConfig())
//                        .signType("RSA") // 不填默认为RSA
//                        .build();
//        PrepayWithRequestPaymentResponse response = new PrepayWithRequestPaymentResponse();
//        try {
//            PrepayRequest request = new PrepayRequest();
//            request.setAppid(wxPayConfig.getAppId());
//            request.setMchid(wxPayConfig.getMerchantId());
//            request.setDescription("111");
//            request.setOutTradeNo(jsonObject.getString("OutTradeNo"));
//            request.setNotifyUrl(wxPayConfig.getPayNotifyUrl());
//            Amount amount = new Amount();
//            // 微信支付的单位是分，这里都需要乘以100
//            amount.setTotal(100*100);
//            request.setAmount(amount);
//            Payer payer = new Payer();
//            payer.setOpenid(jsonObject.getString("wxopenid"));
//            request.setPayer(payer);
//           System.out.println("请求预支付下单，请求参数：{}"+ JSONObject.toJSONString(request));
//            // 调用预下单接口
//            response = service.prepayWithRequestPayment(request);
//            System.out.println("订单【{}】发起预支付成功，返回信息：{}"+"111"+response);
//        } catch (HttpException e) { // 发送HTTP请求失败
//            System.out.println("微信下单发送HTTP请求失败，错误信息：{}"+ e.getMessage());
//            return ResultData.error(202,"下单失败");
//        } catch (ServiceException e) { // 服务返回状态小于200或大于等于300，例如500
//            System.out.println("微信下单服务状态错误，错误信息：{}"+ e.getErrorMessage());
//            return ResultData.error(202,"下单失败");
//        } catch (MalformedMessageException e) { // 服务返回成功，返回体类型不合法，或者解析返回体失败
//            System.out.println("服务返回成功，返回体类型不合法，或者解析返回体失败，错误信息：{}"+ e.getMessage());
//            return ResultData.error(202,"下单失败");
//        }
//
//        // 更新订单状态
//        // 这里就可以更新订单状态为待支付之类的
//
//        return ResultData.success(response);
//    }
//
//
//
//    @PostMapping("/payNotify")
//    public synchronized Result payNotify(HttpServletRequest request) throws IOException {
//        // 请求头Wechatpay-Signature
//        String signature = request.getHeader("Wechatpay-Signature");
//        // 请求头Wechatpay-nonce
//        String nonce = request.getHeader("Wechatpay-Nonce");
//        // 请求头Wechatpay-Timestamp
//        String timestamp = request.getHeader("Wechatpay-Timestamp");
//        // 微信支付证书序列号
//        String serial = request.getHeader("Wechatpay-Serial");
//        // 签名方式
//        String signType = request.getHeader("Wechatpay-Signature-Type");
//
//        // 构造 RequestParam
//        RequestParam requestParam = new RequestParam.Builder()
//                .serialNumber(serial)
//                .nonce(nonce)
//                .signature(signature)
//                .timestamp(timestamp)
//                .signType(signType)
//                .body(HttpServletUtils.getRequestBody(request))
//                .build();
//
//        // 初始化 NotificationParser
//        NotificationParser parser = new NotificationParser(wxPayAutoCertificateConfig.rsaAutoCertificateConfig());
//        // 以支付通知回调为例，验签、解密并转换成 Transaction
//        System.out.println("验签参数：{}"+ requestParam);
//        Transaction transaction = parser.parse(requestParam, Transaction.class);
//        System.out.println("验签成功！-支付回调结果：{}"+transaction.toString());
//
//
//
//        if (Transaction.TradeStateEnum.SUCCESS != transaction.getTradeState()) {
//            System.out.println("内部订单号【{}】,微信支付订单号【{}】支付未成功"+transaction.getOutTradeNo()+transaction.getTransactionId());
//            return ResultData.success("支付未成功");
//        }
//
//
//        // TODO 修改订单信息
//
//        return ResultData.success("支付成功");
//    }
//
//
////    @ApiOperation(value = "根据支付订单号查询订单", notes = "根据支付订单号查询订单")
//    @PostMapping("/queryOrder")
//    public Result queryOrder( @RequestBody JSONObject jsonObject) {
//        QueryOrderByIdRequest queryRequest = new QueryOrderByIdRequest();
//        queryRequest.setMchid(wxPayConfig.getMerchantId());
//        queryRequest.setTransactionId(jsonObject.getString("paymentNo"));
//        try {
//            JsapiServiceExtension service =
//                    new JsapiServiceExtension.Builder()
//                            .config(wxPayAutoCertificateConfig.rsaAutoCertificateConfig())
//                            .signType("RSA") // 不填默认为RSA
//                            .build();
//            Transaction result = service.queryOrderById(queryRequest);
//            if (Transaction.TradeStateEnum.SUCCESS != result.getTradeState()) {
////                log.info("内部订单号【{}】,微信支付订单号【{}】支付未成功", result.getOutTradeNo(), result.getTransactionId());
//            }
//        } catch (ServiceException e) {
////            log.error("订单查询失败，返回码：{},返回信息：{}", e.getErrorCode(),  e.getErrorCode());
//            return ResultData.error(Integer.valueOf(e.getErrorCode()), e.getErrorCode());
//        }
//        return ResultData.success();
//    }
//}
